import java.awt.*;
import java.awt.event.KeyEvent;

/**
 * 坦克类
 * <p>
 * 最基础的面向对象的设计思想:
 * a.抽象出名词: 类,属性
 * b.抽象出动词: 方法
 */

public class Tank {
    private int x, y;
    // 坦克的炮筒的方向
    private Dir dir ;
    public static final int SPEED = 5;  //  坦克移动的速度

    private boolean bL, bU, bR, bD; /* 按键是否弹起来的标识 */









    public Tank(int x, int y, Dir dir) {
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public void paint(Graphics g) {
        g.fillRect(x, y, 50, 50);
        move();

    }

    /*
    * 按键 按下时的操作
    * */
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        // 炮弹的方向就是坦克移动饿方向
        switch (key) {
            case KeyEvent.VK_LEFT:
                System.out.print("左边");
                bL = true;
                dir = Dir.L;
                break;
            case KeyEvent.VK_UP:
                System.out.print("上边");
                bU = true;
                dir = Dir.U;
                break;
            case KeyEvent.VK_RIGHT:
                System.out.print("右边");
                bR = true;
                dir = Dir.R;
                break;
            case KeyEvent.VK_DOWN:
                System.out.print("下边");
                bD = true;
                dir = Dir.D;
                break;
        }
        /*
        * 这里面调用  move() 方法会有问题，
        * 因为有时候需要电脑随机生成坦克，这些生成的坦克是没有触发按键操作的
        */
        // move();

        // 键盘按下之后计算移动方向
        setMainDir();




    }




    /*
    * 按键 弹起时的操作
    * */
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        // 炮弹的方向就是坦克移动饿方向
        switch (key) {
            case KeyEvent.VK_LEFT:
                bL = false;
                break;
            case KeyEvent.VK_UP:
                bU = false;
                break;
            case KeyEvent.VK_RIGHT:
                bR = false;
                break;
            case KeyEvent.VK_DOWN:
                bD = false;
                break;
        }

    }

    /*
     * 坦克移动
     * */
    private void move() {
        switch (dir) {
            case L:
                x -= SPEED;
                break;
            case U:
                y -= SPEED;
                break;
            case R:
                x += SPEED;
                break;
            case D:
                y += SPEED;
                break;
        }
        // 键盘弹起之后计算移动方向
        setMainDir();
    }

    /*
    * 设置 坦克 的移动方向
    * */
    private void setMainDir() {

        /* 四个键都没有被按下，那么坦克就应该停止，这样就能解决最后按了之后，按任意键都能保留最后的方向移动的BUG */
        if (!bL && !bU && !bR && !bD)
            dir = Dir.STOP;
        if (bL && !bU && !bR && !bD)
            dir = Dir.L;
        if (!bL && bU && !bR && !bD)
            dir = Dir.U;
        if (!bL && !bU && bR && !bD)
            dir = Dir.R;
        if (!bL && !bU && !bR && bD)
            dir = Dir.D;
        /* 如果要设置八个方向的话，那么枚举类型的Dir 也要设置八个方向 */




    }



}
